/*
 * Devido 'a complexidade de validacao do CPF,
 * foi criada essa classe para cuidar especialmente desse caso e, assim,
 * reduzir o co'digo de verificacao da classe 'Validacao'
 * Exemplo:     Validacao.validaCPF -> (chama) -> CPF.validaCPF
 * 
 */

package br.uniceub.fsw.util;

/**
 *
 * @author sergiofernandomuniz
 * @version 1.0
 * @see "Veja as classes InputHtml, Validacao"
 * 
 */
public class CPF {
    
    private static String calculaDigitoVerificador(String cpf) {
        
        Integer primeiroDigitoVerificador, segundoDigitoVerificador;  
        int soma = 0, peso = 10;  
        
        for (int i = 0; i < cpf.length(); i++)  
                soma += Integer.parseInt(cpf.substring(i, i + 1)) * peso--;  
  
        if (soma % 11 == 0 | soma % 11 == 1)  
            primeiroDigitoVerificador = new Integer(0);  
        else  
            primeiroDigitoVerificador = new Integer(11 - (soma % 11));  
  
        soma = 0;  
        peso = 11;  
        
        for (int i = 0; i < cpf.length(); i++)
            
                soma += Integer.parseInt(cpf.substring(i, i + 1)) * peso--;  
          
        soma += primeiroDigitoVerificador.intValue() * 2;  
        
        if (soma % 11 == 0 | soma % 11 == 1)  
            segundoDigitoVerificador = new Integer(0);  
        else  
            segundoDigitoVerificador = new Integer(11 - (soma % 11));  
  
        return primeiroDigitoVerificador.toString() + segundoDigitoVerificador.toString();  
    
    }  
  
    private static int validaSegundoDigitoVerificador(String cpf, 
            int primeiroDigitoVerificador) {  
        
        int soma = 0, peso = 11;  
        
        for (int i = 0; i < cpf.length(); i++)  
                soma += Integer.parseInt(cpf.substring(i, i + 1)) * peso--;  
          
        soma += primeiroDigitoVerificador * 2;  
        
        if (soma % 11 == 0 | soma % 11 == 1)  
        
            return 0;  
        
        else
            
            return 11 - (soma % 11);  
    
    }  
  
    public static String geraCpfParaTeste() {  
        String iniciais = "";  
        Integer numero;  
        for (int i = 0; i < 9; i++) {  
            numero = new Integer((int) (Math.random() * 10));  
            iniciais += numero.toString();  
        }  
        return iniciais + calculaDigitoVerificador(iniciais);  
    }  
  
    public static boolean validaCPF(String cpf) {  
        if (cpf.length() != 11)
            return false;  
  
        String numDig = cpf.substring(0, 9);  
        
        return calculaDigitoVerificador(numDig).equals(cpf.substring(9, 11));  
    }

}
